/**
 * Software License, Version 1.0
 * 
 * Copyright 2003 The Trustees of Indiana University.  All rights reserved.
 * 
 *
 *Redistribution and use in source and binary forms, with or without 
 *modification, are permitted provided that the following conditions are met:
 *
 *1) All redistributions of source code must retain the above copyright notice,
 * the list of authors in the original source code, this list of conditions and
 * the disclaimer listed in this license;
 *2) All redistributions in binary form must reproduce the above copyright 
 * notice, this list of conditions and the disclaimer listed in this license in
 * the documentation and/or other materials provided with the distribution;
 *3) Any documentation included with all redistributions must include the 
 * following acknowledgement:
 *
 *"This product includes software developed by the Community Grids Lab. For 
 * further information contact the Community Grids Lab at 
 * http://communitygrids.iu.edu/."
 *
 * Alternatively, this acknowledgement may appear in the software itself, and 
 * wherever such third-party acknowledgments normally appear.
 * 
 *4) The name Indiana University or Community Grids Lab or NaradaBrokering, 
 * shall not be used to endorse or promote products derived from this software 
 * without prior written permission from Indiana University.  For written 
 * permission, please contact the Advanced Research and Technology Institute 
 * ("ARTI") at 351 West 10th Street, Indianapolis, Indiana 46202.
 *5) Products derived from this software may not be called NaradaBrokering, 
 * nor may Indiana University or Community Grids Lab or NaradaBrokering appear
 * in their name, without prior written permission of ARTI.
 * 
 *
 * Indiana University provides no reassurances that the source code provided 
 * does not infringe the patent or any other intellectual property rights of 
 * any other entity.  Indiana University disclaims any liability to any 
 * recipient for claims brought by any other entity based on infringement of 
 * intellectual property rights or otherwise.  
 *
 *LICENSEE UNDERSTANDS THAT SOFTWARE IS PROVIDED "AS IS" FOR WHICH NO 
 *WARRANTIES AS TO CAPABILITIES OR ACCURACY ARE MADE. INDIANA UNIVERSITY GIVES
 *NO WARRANTIES AND MAKES NO REPRESENTATION THAT SOFTWARE IS FREE OF 
 *INFRINGEMENT OF THIRD PARTY PATENT, COPYRIGHT, OR OTHER PROPRIETARY RIGHTS. 
 *INDIANA UNIVERSITY MAKES NO WARRANTIES THAT SOFTWARE IS FREE FROM "BUGS", 
 *"VIRUSES", "TROJAN HORSES", "TRAP DOORS", "WORMS", OR OTHER HARMFUL CODE.  
 *LICENSEE ASSUMES THE ENTIRE RISK AS TO THE PERFORMANCE OF SOFTWARE AND/OR 
 *ASSOCIATED MATERIALS, AND TO THE PERFORMANCE AND VALIDITY OF INFORMATION 
 *GENERATED USING SOFTWARE.
 */
package cgl.narada.transport;

/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Company: </p>
 * @author Gurhan Gunduz
 * @version 1.0
 */

import cgl.narada.performance.ComputeMetrics;
import cgl.narada.performance.LinkPerformanceDataImpl;
import cgl.narada.performance.PerformanceMessageCreator;

public class MonitoredLink {

  private ComputeMetrics compMetric=new ComputeMetrics();
  private PerformanceMessageCreator performanceMessageCreator=new PerformanceMessageCreator();
  private int lossTracker=0;
  private boolean gatherPerformance=false;


  private LinkPerformanceDataImpl[] m_perfData = {
    new LinkPerformanceDataImpl("Mean","mean ","ms"),
    new LinkPerformanceDataImpl("Std Dev","Standart deviation","ms"),
    new LinkPerformanceDataImpl("jitter","Jitter","ms"),
    new LinkPerformanceDataImpl("Loss Rate", "Loss Rate", "%"),
  };


  public MonitoredLink() {
  }

  public byte[] sendPerformancePackets() throws TransportException {

   byte[] createdPerformanceMessage=performanceMessageCreator.createPerformanceMessage(lossTracker);
   lossTracker++;
   return createdPerformanceMessage;
  }


  public void processPerformancePackets(byte[] perfData) {
    m_perfData=compMetric.calculateMetrics(m_perfData, perfData, lossTracker-1);

  }

//return the latency values of a link
  public long[] getLatencies(){
    return compMetric.getLatencyValues();
  }

  /** Used to enable or disable performance gathering on a communication
      link */
  public void setPerformanceGathering(boolean gather) {
    gatherPerformance = gather;
  }

  /** Used to test weather performing gathering is enabled for a given
      communication link */
  public boolean performanceGatheringEnabled() {
    return gatherPerformance;
  }


  /** Returns the list of performance factors that are measured on this
      communication link */
  public String[] getPerformanceFactorsMeasured() {
    String [] pFactor=new String[m_perfData.length];
    for (int i=0; i<m_perfData.length;i++){
      pFactor[i]=m_perfData[i].getParameterName();
    }
    return pFactor;
  }


//disable the specific performance factor.
  public void disablePerformanceFactor(String factor){
    for (int i=0; i<m_perfData.length;i++){
      if(m_perfData[i].getParameterName().equalsIgnoreCase(factor)){
        m_perfData[i].setParameterValue("NM");
      }
    }
  }


//enable the specific performance factor.
  public void enablePerformanceFactor(String factor){
    for (int i=0; i<m_perfData.length;i++){
      if(m_perfData[i].getParameterName().equalsIgnoreCase(factor)){
        m_perfData[i].setParameterValue("NA");
      }
    }
  }

  /** Returns the complete set of performance factors measured and their
      corresponding values*/
  public LinkPerformanceData[] getAllPerformanceData() {
    return m_perfData;
  }


  /** Returns the value of a performance factor as a string */

  public String getPerformanceData(String factorName) {

    for (int i=0; i<m_perfData.length;i++){
      if(m_perfData[i].getParameterName().equalsIgnoreCase(factorName)){
        return m_perfData[i].getParameterValue();
      }
    }
    System.out.println("Could not find the Factor");
    return null;
  }

}
